/**
 * 带音频提示的增强 toast 函数
 * 根据 toast 类型播放不同的提示音
 * 自动与系统音频设置绑定，关闭音频通知时 toast 不播放声音
 * 完美兼容 toast.success()、toast.error() 等链式调用
 */

import { toast as sonnerToast } from 'sonner';
import { playNotificationSound, AUDIO_FILES } from './audio';

// Toast 类型定义
export type ToastType = 'default' | 'success' | 'error' | 'warning' | 'info';

// Toast 类型与音频类型的映射
const TOAST_TYPE_TO_AUDIO_TYPE: Record<ToastType, keyof typeof AUDIO_FILES> = {
  'default': 'message',
  'success': 'success',
  'error': 'error',
  'warning': 'alert',
  'info': 'message'
};

// 音频文件路径 - 使用本地生成的提示音
const AUDIO_FILES = {
  message: 'local',
  alert: 'local', 
  success: 'local',
  error: 'local'
};

/**
 * 检查音频设置是否启用
 * 从 localStorage 获取音频设置
 */
function getAudioSettings(): { enabled: boolean; volume: number } {
  try {
    const saved = localStorage.getItem('audio-settings');
    if (saved) {
      const settings = JSON.parse(saved);
      return {
        enabled: settings.enabled ?? true,
        volume: settings.volume ?? 0.2
      };
    }
  } catch (error) {
    console.warn('获取音频设置失败:', error);
  }
  
  // 默认设置
  return {
    enabled: true,
    volume: 0.2
  };
}

/**
 * 增强的 toast 函数，支持音频提示
 * 自动与系统音频设置绑定，关闭音频通知时 toast 不播放声音
 * @param message 消息内容
 * @param options 配置选项
 */
function enhancedToast(
  message: string, 
  options?: {
    type?: ToastType;
    duration?: number;
    playSound?: boolean;
    volume?: number;
  }
) {
  const {
    type = 'default',
    duration,
    playSound = true,
    volume = 0.2
  } = options || {};

  // 获取系统音频设置
  const audioSettings = getAudioSettings();
  
  // 播放提示音（仅在系统音频通知启用且 playSound 为 true 时）
  if (playSound && audioSettings.enabled) {
    const audioType = TOAST_TYPE_TO_AUDIO_TYPE[type];
    // 使用系统音量设置或传入的音量设置
    const finalVolume = 0.2
    playNotificationSound(audioType, finalVolume);
  }

  // 根据类型调用不同的 sonner toast
  switch (type) {
    case 'success':
      return sonnerToast.success(message, { duration });
    case 'error':
      return sonnerToast.error(message, { duration });
    case 'warning':
      return sonnerToast.warning(message, { duration });
    case 'info':
      return sonnerToast.info(message, { duration });
    default:
      return sonnerToast(message, { duration });
  }
}

// 创建兼容的 toast 对象，支持链式调用
const toast = Object.assign(
  (message: string, options?: { duration?: number; playSound?: boolean; volume?: number }) => {
    return enhancedToast(message, { ...options, type: 'default' });
  },
  {
    success: (message: string, options?: { duration?: number; playSound?: boolean; volume?: number }) => {
      return enhancedToast(message, { ...options, type: 'success' });
    },
    error: (message: string, options?: { duration?: number; playSound?: boolean; volume?: number }) => {
      return enhancedToast(message, { ...options, type: 'error' });
    },
    warning: (message: string, options?: { duration?: number; playSound?: boolean; volume?: number }) => {
      return enhancedToast(message, { ...options, type: 'warning' });
    },
    info: (message: string, options?: { duration?: number; playSound?: boolean; volume?: number }) => {
      return enhancedToast(message, { ...options, type: 'info' });
    }
  }
);

/**
 * 成功 toast，播放成功提示音
 */
export function toastSuccess(message: string, options?: { duration?: number; playSound?: boolean; volume?: number }) {
  return enhancedToast(message, { ...options, type: 'success' });
}

/**
 * 错误 toast，播放错误提示音
 */
export function toastError(message: string, options?: { duration?: number; playSound?: boolean; volume?: number }) {
  return enhancedToast(message, { ...options, type: 'error' });
}

/**
 * 警告 toast，播放警告提示音
 */
export function toastWarning(message: string, options?: { duration?: number; playSound?: boolean; volume?: number }) {
  return enhancedToast(message, { ...options, type: 'warning' });
}

/**
 * 信息 toast，播放信息提示音
 */
export function toastInfo(message: string, options?: { duration?: number; playSound?: boolean; volume?: number }) {
  return enhancedToast(message, { ...options, type: 'info' });
}

/**
 * 静默 toast，不播放提示音
 */
export function toastSilent(message: string, options?: { duration?: number; type?: ToastType }) {
  return enhancedToast(message, { ...options, playSound: false });
}

// 导出兼容的 toast 对象，支持 toast.success()、toast.error() 等链式调用
export { toast };

// 导出原始的 sonner toast 函数，以便需要时使用
export { sonnerToast as originalToast };